package com.example.demo;

import org.apache.commons.io.FileUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.io.File;
import java.io.IOException;
import java.time.Duration;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import static java.lang.Thread.sleep;

public class Main {
    public static void main(String[] args) throws InterruptedException, IOException {
//        test1();
//        test2();
//        test3();
//        test4();
//        test5();
//        test6();
//        reviewTest();
//        test7();
//        test8();
//        test9();
//        test10();
//        test11();
//        test12();
//        test13();
//        test14();
//        test15();
//        test16();
//        test17();
//        test18();
//        test19();
        page1();
    }

    private static void page1() throws InterruptedException {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        // 打开 test01.html
        driver.get("http://localhost:63342/demo/demo/src/main/java/com/example/demo/Page/test01.html?_ijt=sjnqtmlkp61r9t0jb9094me0bi&_ij_reload=RELOAD_ON_SAVE");
        List<WebElement> webElements = driver.findElements(By.cssSelector("input"));
        for (int i = 0; i < webElements.size(); i++) {
            if (webElements.get(i).getAttribute("type").equals("checkbox")) {
                webElements.get(i).click();
            }
        }
//        sleep(3000);
//        driver.quit();
    }

    private static void test19() throws InterruptedException, IOException {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        // 打开百度首页
        driver.get("https://www.baidu.com/");
        // 输入
        driver.findElement(By.cssSelector("#kw")).sendKeys("123456");
        driver.findElement(By.cssSelector("#su")).click();
        sleep(2000);
        // 把截的图放到file这个临时变量中
        File file = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        // 把file保存到磁盘中
        FileUtils.copyFile(file, new File("D://截图2024_07_03.png"));
        driver.quit();
    }

    private static void test18() throws InterruptedException {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        // 打开百度首页
        driver.get("https://www.baidu.com/");
        // 点击新闻按钮
        driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        sleep(2000);
        // 找到新窗口
        String cur_handle = driver.getWindowHandle();
        System.out.println("当前的窗口句柄：" + cur_handle);
        // 获取到浏览器当前所有的窗口句柄
        Set<String> all_handles = driver.getWindowHandles();
        // "1111"
        // "2222"
        for (String tmp : all_handles) {
            if (!tmp.equals(cur_handle)) {
                // 切换到最后一个窗口句柄
                System.out.println("切换的窗口句柄：" + cur_handle);
                driver.switchTo().window(tmp);
            }
        }
        sleep(2000);
        // 输入“经济新闻头条”，并搜索
        driver.findElement(By.cssSelector("#ww")).sendKeys("经济新闻头条");
        driver.findElement(By.cssSelector("#s_btn_wr")).click();
        sleep(2000);
        // 找到搜索结果
        List<WebElement> elements = driver.findElements(By.xpath("//em[text()=\"经济\"]"));
        sleep(2000);
        int flag = 0;
        for (int i = 0; i < elements.size(); i++) {
            if (elements.get(i).getText().equals("经济") || elements.get(i).getText().equals("头条")) {
                flag = 1;
                break;
            }
        }
        if (flag == 0) {
            System.out.println("测试不通过");
        } else {
            System.out.println("测试通过");
        }
        driver.quit();
    }

    private static void test17() throws InterruptedException {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        // 打开百度首页
        driver.get("https://www.baidu.com/");
        // 点击新闻按钮
        driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        sleep(2000);
        // 找到新窗口
        String cur_handle = driver.getWindowHandle();
        System.out.println("当前的窗口句柄：" + cur_handle);
        // 获取到浏览器当前所有的窗口句柄
        Set<String> all_handles = driver.getWindowHandles();
        String target = "";
        // "1111"
        // "2222"
        for (String tmp : all_handles) {
            target = tmp;
        }
        // 切换到最后一个窗口句柄
        System.out.println("切换的窗口句柄：" + cur_handle);
        driver.switchTo().window(target);
        sleep(2000);
        // 输入“经济新闻头条”
        driver.findElement(By.cssSelector("#ww")).sendKeys("经济新闻头条");
        sleep(2000);
        // 找到搜索结果
        driver.quit();
    }

    private static void test16() throws InterruptedException {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        // 打开百度首页
        driver.get("https://www.baidu.com/");
        // 输入“企业微信”并点击搜索
        driver.findElement(By.cssSelector("#kw")).sendKeys("企业微信");
        driver.findElement(By.cssSelector("#su")).click();
        sleep(2000);
        // 鼠标操作
        Actions actions = new Actions(driver);
        sleep(2000);
        WebElement target = driver.findElement(By.cssSelector("#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-pic_p4Uej.s-tab-pic"));
        sleep(2000);
        // 需要在后面加上perform()才能看到效果
        actions.moveToElement(target).contextClick().perform();
        sleep(2000);
        driver.quit();
    }

    private static void test15() throws InterruptedException {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        // 打开百度首页
        driver.get("https://www.baidu.com/");
        // 输入“蛋糕”
        driver.findElement(By.cssSelector("#kw")).sendKeys("蛋糕");
        // 全选
        driver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"A");
        sleep(3000);
        // 剪切
        driver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"X");
        sleep(3000);
        // 粘贴
        driver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"V");
        sleep(3000);
        // 点击百度一下按钮
        driver.findElement(By.cssSelector("#su")).click();
        sleep(2000);
        // 校验
        String no_expected_url = "https://www.baidu.com/";
        String cur_url = driver.getCurrentUrl();
        sleep(2000);
        if (!cur_url.equals(no_expected_url)) {
            System.out.println("测试通过");
        } else {
            System.out.println("测试不通过");
        }
        driver.quit();
    }

    private static void test14() throws InterruptedException {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        // 打开百度首页
        driver.get("https://www.baidu.com/");
        // 输入“蛋糕”
        driver.findElement(By.cssSelector("#kw")).sendKeys("蛋糕");
        sleep(3000);
        // 回车
        driver.findElement(By.cssSelector("#kw")).sendKeys(Keys.ENTER);
        sleep(2000);
        // 校验
        List<WebElement> elements = driver.findElements(By.xpath("//font[text()=\"蛋糕\"]"));
        sleep(2000);
        for (int i = 0; i < elements.size(); i++) {
            if (elements.get(i).getText().equals("蛋糕")) {
                System.out.println("测试通过");
                break;
            } else {
                System.out.println("测试不通过");
            }
        }
        driver.quit();
    }

    private static void test13() throws InterruptedException {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        // 打开百度首页
        driver.get("https://www.baidu.com/");
        driver.navigate().to("https://www.baidu.com/");
        // 输入“鲜花”
        driver.findElement(By.cssSelector("#kw")).sendKeys("鲜花");
        sleep(2000);
        // 点击“百度一下”按钮
        driver.findElement(By.cssSelector("#su")).click();
        sleep(2000);
        // 浏览器滚动条滑到最下面
        ((JavascriptExecutor)driver).executeScript("document.documentElement.scrollTop=10000");
        sleep(5000);
        // 浏览器滚动条滑到最上面
        ((JavascriptExecutor)driver).executeScript("document.documentElement.scrollTop=0");
        sleep(5000);
        driver.quit();
    }

    private static void test12() throws InterruptedException {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        // 打开百度首页
        driver.get("https://www.baidu.com/");
        driver.navigate().to("https://www.baidu.com/");
        // 输入“张三”
        driver.findElement(By.cssSelector("#kw")).sendKeys("张三");
        sleep(2000);
        // 点击“百度一下”按钮
        driver.findElement(By.cssSelector("#su")).click();
        sleep(2000);
        // 浏览器先后退再前进
        driver.navigate().back();
        sleep(2000);
        driver.navigate().forward();
        // 获取当前页面url
        String url = driver.getCurrentUrl();
        sleep(2000);
        // 如果当前url不等于https://www.baidu.com/，测试通过
        if (!url.equals("https://www.baidu.com/")) {
            System.out.println("测试通过");
        } else {
            System.out.println("测试不通过");
        }
        driver.quit();
    }

    private static void test11() throws InterruptedException {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        // 打开百度首页
        driver.get("https://www.baidu.com/");
        // 输入“张三”
        driver.findElement(By.cssSelector("#kw")).sendKeys("张三");
        // 点击“百度一下”按钮
        driver.findElement(By.cssSelector("#su")).click();
        sleep(2000);
        // 浏览器后退
        driver.navigate().back();
        // 获取当前页面url
        String url = driver.getCurrentUrl();
        sleep(2000);
        // 如果当前url等于https://www.baidu.com/，测试通过
        if (url.equals("https://www.baidu.com/")) {
            System.out.println("测试通过");
        } else {
            System.out.println("测试不通过");
        }
        driver.quit();
    }

    private static void test10() throws InterruptedException {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        // 打开百度首页
        driver.get("https://www.baidu.com/");
        // 设置浏览器大小为正方形
        driver.manage().window().setSize(new Dimension(200,200));
        sleep(3000);
        // 校验百度搜索输入框是否存在
        WebElement search_input = driver.findElement(By.cssSelector("#kw"));
        if (search_input == null) {
            System.out.println("测试不通过");
        } else {
            System.out.println("测试通过");
        }
        driver.quit();
    }

    private static void test9() throws InterruptedException {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        // 打开百度首页
        driver.get("https://www.baidu.com/");
        // 浏览器最大化
        driver.manage().window().maximize();
        sleep(3000);
        // 定位到换一换这个元素
        String expect_str = driver.findElement(By.cssSelector("#\\32  > div > div > div.cr-title.c-gap-bottom-xsmall > div > a > span")).getText();
        if (expect_str.equals("换一换")) {
            System.out.println("测试通过");
        } else {
            System.out.println("测试不通过");
        }
        driver.quit();
    }

    private static void test8() {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        // 打开百度首页
        driver.get("https://www.baidu.com/");
        // 获取当前页面的url
        String baidu_url = driver.getCurrentUrl();
        System.out.println("百度的url：" + baidu_url);
        if (baidu_url.equals("https://www.baidu.com/")) {
            System.out.println("测试通过");
        } else {
            System.out.println("测试不通过");
        }
        driver.quit();
    }

    private static void test7() {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        // 打开百度首页
        driver.get("https://www.baidu.com");
        // 获取百度页面title
        String baidu_title = driver.getTitle();
        // 如果获取到的title等于“百度一下，你就知道”，测试通过
        if (baidu_title.equals("百度一下，你就知道")) {
            System.out.println("测试通过");
        } else {
            System.out.println("测试不通过");
        }
        driver.quit();
    }

    private static void reviewTest() throws InterruptedException {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        // 打开百度首页
        driver.get("https://www.baidu.com");
        // 定位元素
        driver.findElement(By.cssSelector("#kw")).sendKeys("互联网各大行业");
        // 点击“百度一下”按钮
        driver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        // 清空
        driver.findElement(By.cssSelector("#kw")).clear();
        sleep(3000);
        // 点击百度的logo图标
        driver.findElement(By.cssSelector("#result_logo > img.index-logo-src")).click();
        sleep(3000);
        // 获取“百度一下”的文本，getText获取的是两个标签中间夹着的文本，但是这里的百度一下是标签里的value的属性值
//        String baidu_button = driver.findElement(By.cssSelector("#su")).getText();
        String baidu_button = driver.findElement(By.cssSelector("#su")).getAttribute("value");
        System.out.println("百度一下按钮的文本：" + baidu_button);
        if (baidu_button.equals("百度一下")) {
            System.out.println("测试通过");
        } else {
            System.out.println("测试不通过");
        }
        driver.quit();
    }

    private static void test6() {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        // 打开百度首页
        driver.get("https://www.baidu.com");
        // 使用一下显示等待
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(3));
        wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#s-top-left > a:nth-child(1)")));
        Boolean is_true = wait.until(ExpectedConditions.textToBe(By.cssSelector("#s-top-left > a:nth-child(1)"), "新闻"));
        if (is_true) {
            System.out.println("测试通过");
        } else {
            System.out.println("测试不通过");
        }
    }

    private static void test5() {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        // 打开百度首页
        driver.get("https://www.baidu.com");
        // 找到百度搜索输入框
        WebElement search_input = driver.findElement(By.cssSelector("#kw"));
        // 向百度搜索输入框中输入“软件测试”
        search_input.sendKeys("软件测试");
        // 找到百度搜索输入框
        // 清空百度搜索输入框中的内容
        search_input.clear();
        // 向百度搜索输入框中输入“前端”
        search_input.sendKeys("前端");
        // 找到百度一下，进行点击
        WebElement baidu_button = driver.findElement(By.cssSelector("#su"));
        baidu_button.click();
        // 校验结果是不是有“前端”
        int flag = 0;
        // 隐式等待5小时
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.HOURS);
        List<WebElement> search_results = driver.findElements(By.xpath("//font[text()=\"前端\"]"));
        for (int i = 0; i < search_results.size(); i++) {
            if (search_results.get(i).getText().equals("前端")) {
                flag = 1;
                break;
            }
        }
        if (flag == 1) {
            System.out.println("测试通过");
        } else {
            System.out.println("测试不通过");
        }
    }

    private static void test4() throws InterruptedException {
        trueTest();
//        falseTest();
    }

    // submit()，会报错
    private static void falseTest() {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        // 打开百度首页
        driver.get("https://www.baidu.com");
        // 找到新闻按钮
        WebElement news_button = driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)"));
        // 点击新闻
        news_button.submit();
        // 退出浏览器
        driver.quit();
    }

    // click()，不会报错
    private static void trueTest() {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        // 打开百度首页
        driver.get("https://www.baidu.com");
        // 找到新闻按钮
        WebElement news_button = driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)"));
        // 点击新闻
        news_button.click();
        // 退出浏览器
        driver.quit();
    }

    private static void test3() throws InterruptedException {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        // 打开百度首页
        driver.get("https://www.baidu.com");
        // 找到百度搜索输入框
        WebElement search_input = driver.findElement(By.cssSelector("#kw"));
        // 向百度搜索输入框中输入“软件测试”
        search_input.sendKeys("软件测试");
        // 找到百度搜索输入框
        // 清空百度搜索输入框中的内容
        search_input.clear();
        // 向百度搜索输入框中输入“前端”
        search_input.sendKeys("前端");
        // 找到百度一下，进行点击
        WebElement baidu_button = driver.findElement(By.cssSelector("#su"));
        baidu_button.click();
        // 校验结果是不是有“前端”
        int flag = 0;
        sleep(3000);
        List<WebElement> search_results = driver.findElements(By.xpath("//font[text()=\"前端\"]"));
        for (int i = 0; i < search_results.size(); i++) {
            if (search_results.get(i).getText().equals("前端")) {
                flag = 1;
                break;
            }
        }
        if (flag == 1) {
            System.out.println("测试通过");
        } else {
            System.out.println("测试不通过");
        }
    }

    private static void test2() throws InterruptedException {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver driver = new ChromeDriver(options);
        // 打开百度首页
        driver.get("https://www.baidu.com");
        // 找到搜索输入框
        WebElement search_input = driver.findElement(By.cssSelector("#kw"));
        // 向搜索输入框输入“软件测试”
        search_input.sendKeys("软件测试");
        // 找到“百度一下”
        WebElement baidu_button = driver.findElement(By.cssSelector("#su"));
        // 点击“百度一下”
        baidu_button.click();
        sleep(3000);
        // 找到了页面上所有的“软件测试”相关的元素
        List<WebElement> search_results = driver.findElements(By.xpath("//font[text()=\"软件测试\"]"));
        sleep(3000);
        // 遍历List，如果元素的文本等于软件测试，测试通过
        // 测试不通过
        for (int i = 0; i<search_results.size(); i++) {
            if (search_results.get(i).getText().equals("软件测试")) {
                System.out.println("测试通过");
            } else {
                System.out.println("测试不通过");
            }
        }
    }

    private static void test1() {
        // 初始化Chrome浏览器选项
        ChromeOptions options = new ChromeOptions();
        // 允许所有远程源进行连接，这通常用于处理跨域策略
        options.addArguments("--remote-allow-origins=*");
        // 使用前面设置的选项创建一个Chrome浏览器实例
        WebDriver driver = new ChromeDriver(options);
        // 通过WebDriver接口控制浏览器访问百度首页
        driver.get("https://www.baidu.com");
        // 通过CSS选择器找到百度页面上的搜索输入框
//        WebElement element = driver.findElement(By.cssSelector(".s_ipt"));
        // 通过XPath定位元素
//        WebElement element = driver.findElement(By.xpath("//form/span[1]/input"));
        // 通过标签定位
        WebElement element = driver.findElement(By.tagName("input"));
        if (element == null) {
            System.out.println("测试不通过");
        } else {
            System.out.println("测试通过");
        }
        // 关闭浏览器
//        driver.quit();// 关闭浏览器，以及彻底退出webdriver，并且会释放driverserver的资源
//        driver.close();// 关闭浏览器
    }
}
